package com.sxkj.cyezj.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.sxkj.cyezj.dao.ModuleDao;
import com.sxkj.cyezj.pojo.Module;
import com.sxkj.cyezj.service.ModuleService;

public class ModuleServiceImpl implements ModuleService {

	private ModuleDao moduleDao;
	
	@Override
	public void insertModule(Module module) {
		moduleDao.insertModule(module);
	}

	@Override
	public void deleteModuleById(String mId) {
		moduleDao.deleteModuleById(mId);
	}

	@Override
	public void updateModule(Module module) {
		moduleDao.updateModule(module);
	}

	@Override
	public Module getModule(String mId) {
		return moduleDao.getModule(mId);
	}

	@Override
	public List<Module> getAllModules() {
		return moduleDao.getAllModules(); 
	}

	/**
	 * 得到所有模块，并构成树形结构
	 */
	@Override
	public List<Module> getAllModulesWithStruct() {
		List<Module> sourceList = getAllModules();
		List<Module> topList = getNextLevel(null,sourceList);
		for (Module module : topList) {
			filterChildren(module,sourceList);
		}
		return sourceList;
	}
	/**
	 * 递归得到某个模块的子模块,形成以这个模块为根的树形结构
	 * @param module
	 * @param sourceList
	 */
	private void filterChildren(Module module,List<Module> sourceList) {
		List<Module> subModules = getNextLevel(module.getMId(),sourceList);
		module.setSubModules(subModules);
		for (Module subModule : subModules) {
			filterChildren(subModule,sourceList);
		}
	}
	/**
	 * 得到某个模块的子模块,子模块为同一层
	 * @param parentId
	 * @param sourceList
	 * @return
	 */
	private List<Module> getNextLevel(String parentId,List<Module> sourceList) {
		List<Module> resultList = new ArrayList<Module>();
		for (Module module : sourceList) {
			if((parentId == null && module.getParentId() == null) || (parentId != null && parentId.equals(module.getParentId()))) {
				resultList.add(module);
			}
		}
		return resultList;
	}
	

	public void setModuleDao(ModuleDao moduleDao) {
		this.moduleDao = moduleDao;
	}

	public ModuleDao getModuleDao() {
		return moduleDao;
	}

}
